package br.usp.ime.ingpos.testes.modelo;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.junit.Test;

import br.usp.ime.ingpos.modelo.AreaDePesquisa;
import br.usp.ime.ingpos.modelo.dao.AreaDePesquisaDAO;
import br.usp.ime.ingpos.services.AreaDePesquisaService;
import br.usp.ime.ingpos.testes.BancoDeDadosTestCase;

public class AreaDePesquisaTeste extends BancoDeDadosTestCase {
	private Long areaTesteId;

	public AreaDePesquisaTeste(String name) {
		super(name);
	}

	@Test
	public void testCriarOuAtualizarAreaDeInteresse() {
		AreaDePesquisaService areaDeInteresseService = new AreaDePesquisaService(
				new AreaDePesquisaDAO(getSessionCreator()));
		
		final Set<String> nomes = new HashSet<String>();
		nomes.add("Banco de Dados");
		nomes.add("Bioinformática");
		nomes.add("Combinatória");
		nomes.add("Computação Gráfica");
		nomes.add("Computação Móvel");
		nomes.add("Computação Musical");
		nomes.add("Computação Paralela");
		nomes.add("Criptografia");
		nomes.add("Engenharia de Software");
		nomes.add("Informática na Educação");
		nomes.add("Inteligência Artificial");
		nomes.add("Lógica Computacional");
		nomes.add("Métodos Ágeis");
		nomes.add("Otimização Combinatória");
		nomes.add("Otimização Contínua");
		nomes.add("Processamento de Imagens");
		nomes.add("Reconhecimento de Padrões");
		nomes.add("Redes de Computadores");
		nomes.add("Sistemas Colaborativos");
		nomes.add("Sistemas Distribuídos");
		nomes.add("Sistemas Tutores Inteligentes");
		nomes.add("Software Livre");
		nomes.add("Teoria dos Autômatos");
		nomes.add("Teoria dos Grafos");
		nomes.add("Visão Computacional");

		for (String nome : nomes) {
			if (areaDeInteresseService.procuraAreaDePesquisaPorNome(nome) == null)
				areaDeInteresseService
						.inserirAreaDePesquisa(new AreaDePesquisa(nome, true));
		}

		final List<AreaDePesquisa> areasDeInteresseAtivas = areaDeInteresseService
				.procurarAreasDePesquisaAtivas();
		assertNotNull(areasDeInteresseAtivas);
		assertFalse(areasDeInteresseAtivas.isEmpty());
		assertTrue(nomes.size() == areasDeInteresseAtivas.size());
		
		final List<AreaDePesquisa> areasDeInteresse = areaDeInteresseService
				.procurarTodasAreasDePesquisa();
		assertNotNull(areasDeInteresse);
		assertFalse(areasDeInteresse.isEmpty());
		assertTrue(nomes.size() == areasDeInteresse.size());
	}

	@Test
    public void testInsereEDeletaAreaDePesquisa () {
		AreaDePesquisaService areaDeInteresseService = new AreaDePesquisaService(
				new AreaDePesquisaDAO(getSessionCreator()));
		
		areaDeInteresseService = new AreaDePesquisaService(
				new AreaDePesquisaDAO(getSessionCreator()));
		
    	AreaDePesquisa area = new AreaDePesquisa();
    	area.setInseridaPelaSecretaria(false);
    	area.setNome("Teste");
    	area.geraDescricao();
    	
    	areaDeInteresseService.inserirAreaDePesquisa(area);
    	
    	AreaDePesquisa areaSalva = areaDeInteresseService.procuraAreaDePesquisaPorNome("Teste");
    	assertNotNull(areaSalva);
    	assertEquals (areaSalva.getNome(), "Teste");
    	assertFalse(areaSalva.isInseridaPelaSecretaria());
    	assertEquals (area.getDescricao(), areaSalva.getDescricao());
    	areaTesteId = areaSalva.getAreaDePesquisaID();
    	
    	area = areaSalva;
    	area.setDescricao("Descricao teste");
    	areaDeInteresseService.inserirAreaDePesquisa(area);
    	
    	areaSalva = areaDeInteresseService.procuraAreaDePesquisaPorNome("Teste");
    	assertEquals(areaSalva.getDescricao(), "Descricao teste");    	
    	
    	areaDeInteresseService.deletarAreaDePesquisa(areaSalva);
    	
    	assertNull (areaDeInteresseService.getAreaDePesquisa(areaTesteId));
    	assertNull (areaDeInteresseService.procuraAreaDePesquisaPorNome("Teste"));
    }
}
